#ifndef UEVENT_LISTENER_HPP
#define UEVENT_LISTENER_HPP

#include <vector>
#include <thread>
#include <atomic>
#include <mutex>
#include "NetworkEventCallback.h"
#include "NetworkEvent.h"

/**
 * UeventListener 负责:
 *  1. 启动一个后台线程 (或循环) 监听内核事件 (如 netlink/uevent)；
 *  2. 将捕获的事件解析成 NetworkEvent；
 *  3. 通过 notifyAll(...) 调用所有已注册的回调对象的 onNetworkEvent(event)。
 */
class UeventListener {
public:
    /// 构造函数
    UeventListener();

    /// 析构函数 - 确保在退出前停止监听
    ~UeventListener();

    /**
     * 启动事件监听
     *  - 典型做法: 创建线程, 在其中循环读取 netlink/uevent
     *  - 收到事件后, parseRawEventData(...) 解析
     *  - 然后 notifyAll(...) 分发
     */
    void startListening();

    /// 停止事件监听并回收资源
    void stopListening();

    /**
     * 注册回调对象, 当事件发生时会调用该对象的 onNetworkEvent
     */
    void addCallback(NetworkEventCallback* callback);

    /// 取消注册回调对象
    void removeCallback(NetworkEventCallback* callback);

private:
    /**
     * 实际执行监听循环的函数 (在独立线程中运行)
     *  - 打开netlink/uevent socket
     *  - while(未停止):
     *    * 阻塞等待事件
     *    * parseRawEventData(...) -> NetworkEvent
     *    * notifyAll(event)
     */
    void listenerLoop();

    /// 解析原始数据 -> 转为统一的 NetworkEvent
    NetworkEvent parseRawEventData(const std::string& rawData);

    /// 分发事件给所有已注册的回调
    void notifyAll(const NetworkEvent& event);

private:
    std::vector<NetworkEventCallback*> m_callbacks;  ///< 回调列表
    std::thread m_listenerThread;                     ///< 监听线程
    std::atomic<bool> m_running;                      ///< 是否正在监听
    std::mutex m_callbackMutex;                       ///< 保护回调列表的锁
};

#endif // UEVENT_LISTENER_HPP
